package XML;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;






import javax.print.Doc;

import modelo.jugador.Jugador;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import excepcionesPropias.ElArchivoNoExiste;

public class PuntajesMaximos{

	public Jugador nuevoJugador;
	public LinkedList<Jugador> ranking = new LinkedList<Jugador>();
	private String rutaScores = "src/puntajesMaximos";
	
	public LinkedList<Jugador> generarPuntajeMax(Jugador unJugador ,String unaRuta) throws JDOMException, ElArchivoNoExiste{
		rutaScores = unaRuta;
		try {
			
			//me fijo que el archivo exista
//			File directorio = new File("test/modeloTests/archivosTest/archivosGenerados/maxScores.xml");
			File directorio = new File (rutaScores.concat("/maxScores.xml"));
			if (directorio.exists()){
				ranking = this.generarListaDeJugadores(unaRuta);
				
				ranking.add(unJugador);
				
				this.ordenar();
				
				directorio.delete();
				
				//creo un nuevo archivo con los datos de la lista ordenada
				Element raizNueva = new Element("puntuaciones");
				Document docNuevo = new Document(raizNueva);
				docNuevo.setRootElement(raizNueva);
				
				for (int j=0; j<ranking.size();j++){
					Element nuevoNodo = nodoJugador(ranking.get(j));
					raizNueva.addContent(nuevoNodo);
				}
				XMLOutputter xmlOutput = new XMLOutputter();
		 		xmlOutput.setFormat(Format.getPrettyFormat());
			//	xmlOutput.output(docNuevo, new FileWriter("test/modeloTests/archivosTest/archivosGenerados/maxScores.xml"));
		 		xmlOutput.output(docNuevo, new FileWriter(rutaScores.concat("/maxScores.xml")));
				
			}else{	
				
				
				System.out.println("El archivo NO! existe => se procede a crearlo");
				Element raiz = new Element("puntuaciones");
				Document doc = new Document(raiz);
				doc.setRootElement(raiz);
				
				Element nuevoNodo = nodoJugador(unJugador);
				doc.getRootElement().addContent(nuevoNodo);
				
				
				XMLOutputter xmlOutput = new XMLOutputter();
		 		xmlOutput.setFormat(Format.getPrettyFormat());
//				xmlOutput.output(doc, new FileWriter("test/modeloTests/archivosTest/archivosGenerados/maxScores.xml"));
		 		xmlOutput.output(doc, new FileWriter(rutaScores.concat("/maxScores.xml")));
			}
		  } catch (IOException io) {
			  System.out.println(io.getMessage());
		  } catch (JDOMException ex){
				System.out.println(ex.getMessage());
			}
		
		return ranking;

		}
	//convierte un objeto de la clase Jugador a un nodo para xml FUNCIONA PERFECTO
	public Element nodoJugador(Jugador unJugador){
		Element nodoJugador = new Element("Jugador");
		nodoJugador.setAttribute("Nombre" , unJugador.getNombre());
		nodoJugador.setAttribute("Puntaje" , String.valueOf(unJugador.getPuntaje()));
		return nodoJugador;
	}
	


	public LinkedList<Jugador> generarListaDeJugadores(String unaRuta) throws JDOMException, IOException, ElArchivoNoExiste{
		rutaScores = unaRuta;
		if(this.existeElArchivoDePuntajes(unaRuta)){
		try{
		System.out.println("El archivo pudo cargarse correctamente");
		SAXBuilder constructor = new SAXBuilder();
//		Document doc = constructor.build("test/modeloTests/archivosTest/archivosGenerados/maxScores.xml");
		Document doc = constructor.build(rutaScores.concat("/maxScores.xml"));
		Element raiz = doc.getRootElement();
		
		List<Element> nodos = raiz.getChildren();
						

		//obtengo todos los elementos del nodo raiz y los agrego a una lista
		for(int i=0; i<nodos.size(); i++){
			//creo un jugador con los datos del xml
			nuevoJugador = new Jugador(nodos.get(i).getAttributeValue("Nombre"));
			nuevoJugador.aumentarMovsEn(Integer.parseInt(nodos.get(i).getAttributeValue("Puntaje")));
			ranking.add(nuevoJugador);	
		}
		}catch (JDOMException ex){
			System.out.println("No Existe El Archivo Requerido");
		}
		}else{
			throw new ElArchivoNoExiste();
		}
		
		return ranking;
	}
	

	public void mostrarUsuarios(){
		int i=0;
		while(i<ranking.size()){
			System.out.println(ranking.get(i).getNombre());
			System.out.println(ranking.get(i).getPuntaje());
			i++;
		}
	}

	public void ordenar(){
		 for (int i = 0; i < ranking.size(); i++) {
		     for (int j = 0; j < (ranking.size() - 1); j++) {
		  if (ranking.get(j).getPuntaje() < ranking.get(j+1).getPuntaje()) {
		      Jugador aux = ranking.get(j);
		      ranking.set(j, ranking.get(j+1));
		      ranking.set(j+1, aux);
		  }
		     }
		 }
	}
	
	public boolean existeElArchivoDePuntajes(String unaRuta){
		File directorio = new File(unaRuta);
		return(directorio.exists());
	}
	
	
}

